/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;

import bean.Contenedor;
import bean.NoRefrigerado;
import bean.Refrigerado;
import java.util.ArrayList;
import java.sql.*;

/**
 *
 * @author Karina
 */
public class SQLServerDAOContenedor implements DAOContenedor {

    @Override
    public ArrayList<Contenedor> queryAllContenedor() {
            ArrayList <Contenedor> contenedorList = new ArrayList<Contenedor>();
            Connection conn = null;
            PreparedStatement pstmt = null;
            PreparedStatement pstmt2=null;
            PreparedStatement pstmt3=null;
            ResultSet rs = null;
            ResultSet rs2=null;
            ResultSet rs3=null;
            try{
                //1. Se registra el driver de la BD
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                //Driver myDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
                //2. Se abre la conexión
                String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                    "databaseName=inf282;user=inf282;password=inf282db;";
                conn = DriverManager.getConnection(connectionUrl);
                //3. Se ejecuta la sentencia SQL
                pstmt = conn.prepareStatement("SELECT * FROM G04_CONTENEDOR");
                rs =  pstmt.executeQuery();
                //4. Se evalúan los resultados
                while (rs.next()){
                        int id = rs.getInt("IDCONTENEDOR");
                        float peso_neto = rs.getFloat("PESO_NETO");
                        float peso_bruto = rs.getFloat("PESO_BRUTO");
                        float volumen = rs.getFloat("VOLUMEN");
                        String desc=rs.getString("DESCRIPCION");
                        float tara = rs.getFloat("TARA");
                        String tipoC= rs.getString("TIPO");
                        //Contenedor cont= null;
                     //   cont = new Contenedor(id,peso_neto,peso_bruto,volumen,desc,tara,tipoC);
                    if (tipoC.equalsIgnoreCase("R")) {
                        pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM G04_REFRIGERADO "
                                + " where G04_REFRIGERADO.IDCONTENEDOR=" + id + "");
                        rs2 = pstmt2.executeQuery();
                        if (rs2.next()) {
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            Contenedor cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                            contenedorList.add(cont);
                        }
                        rs2.close();
                    } else {
                        pstmt3 = conn.prepareStatement("SELECT TIPO_DE_CONTENIDO, ESTADO FROM G04_NO_REFRIGERADO "
                                 +" where G04_NO_REFRIGERADO.IDCONTENEDOR="+id+"");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_DE_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    Contenedor cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     contenedorList.add(cont);
                     }
                     rs3.close();
                    }
                   //contenedorList.add(cont);
            }



            }catch(Exception ex){
                ex.printStackTrace();
            }finally{
                 //5. Se cierra la conexión
                try {if (rs != null) rs.close(); }
                 catch(Exception e){
                     e.printStackTrace();
                 }
            }
            
        return contenedorList;
    }

    @Override
    public int insertCont(Contenedor cont) {
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2= null;
        ResultSet rs = null;

        try {
            //1. Se registra el driver de la BD
            //Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Driver myDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                    "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            String SQLString2 = null;
            SQLString =
                    "INSERT INTO G04_CONTENEDOR(IDCONTENEDOR,PESO_NETO,PESO_BRUTO,VOLUMEN,DESCRIPCION,TARA,TIPO) "
                    + "VALUES(?,?,?,?,?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1, cont.getId());
                pstmt.setFloat(2, cont.getPeso_neto());
                pstmt.setFloat(3, cont.getPeso_bruto());
                pstmt.setFloat(4, cont.getVolumen());
                pstmt.setString(5, cont.getDescripcionMerc());
                pstmt.setFloat(6, cont.getTara());
                pstmt.setString(7, cont.getTipoContenedor());

                result =  pstmt.executeUpdate();
            if (cont instanceof Refrigerado){

                SQLString = "INSERT INTO G04_REFRIGERADO(IDCONTENEDOR,TEMPERATURA,MOTOR) "
                        + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1, cont.getId());
                pstmt.setFloat(2, ((Refrigerado)cont).getTemperatura());
                pstmt.setString(3, ((Refrigerado)cont).getMotor());
                

            } else if (cont instanceof NoRefrigerado){

                SQLString = "INSERT INTO G04_NO_REFRIGERADO(IDCONTENEDOR,TIPO_DE_CONTENIDO,ESTADO) "
                        + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1, cont.getId());
                pstmt.setString(2, ((NoRefrigerado)cont).getTipoContenido());
                pstmt.setString(3, ((NoRefrigerado)cont).getEstado());
                //result =  pstmt.executeUpdate();
            }
                    
            result =  pstmt.executeUpdate();

            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }
        } catch (Exception ex) {
            //ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); }
             catch(Exception e){e.printStackTrace();}
        }

        return result;
    }

    @Override
    public int updateCont(Contenedor nuevoCont) {
        int result=0;
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        int nid=nuevoCont.getId();
        float npeso_neto = nuevoCont.getPeso_neto();
        float npeso_bruto = nuevoCont.getPeso_neto();
        float nvolumen = nuevoCont.getVolumen();
        String ndesc=nuevoCont.getDescripcionMerc();
        float ntara =nuevoCont.getTara();
        String ntipoC=nuevoCont.getTipoContenedor();
        
        try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String url = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                                   "databaseName=inf282;user=inf282;password=inf282db;";
            con = DriverManager.getConnection(url);
            
            String SQLString = null;
            SQLString ="UPDATE G04_CONTENEDOR SET "+
                       "IDCONTENEDOR = '"+nid+
                       "',PESO_NETO = '"+npeso_neto+
                       "',PESO_BRUTO = '"+npeso_bruto+
                       "',VOLUMEN = '"+nvolumen+
                       "',DESCRIPCION = '"+ndesc+
                       "',TARA = '"+ntara+"'"+
                       "',TIPO = '"+ntipoC+"'"+
                       " WHERE IDCONTENEDOR = '"+nid+"'";
            
            pstmt = con.prepareStatement(SQLString);
            result =  pstmt.executeUpdate();
            
            if (nuevoCont instanceof Refrigerado){

                float ntemperatura = ((Refrigerado)nuevoCont).getTemperatura();
                String nmotor = ((Refrigerado)nuevoCont).getMotor();
                
                SQLString = "UPDATE G04_REFRIGERADO SET " +
                         "TEMPERATURA = '"+ntemperatura+
                         "',MOTOR = '"+nmotor+
                         " WHERE IDCONTENEDOR = '"+nid+"'";
                
                
                pstmt = con.prepareStatement(SQLString);
                

            } else if (nuevoCont instanceof NoRefrigerado){

                String ntipoContenido  = ((NoRefrigerado)nuevoCont).getTipoContenido();
                String nestado = ((NoRefrigerado)nuevoCont).getEstado();
                
                SQLString = "UPDATE G04_ NO_REFRIGERADO SET " +
                         "TIPO_DE_CONTENIDO = '"+ntipoContenido+
                         "',ESTADO = '"+nestado+
                         " WHERE IDCONTENEDOR = '"+nid+"'";
                pstmt = con.prepareStatement(SQLString);
                
            }
            result =  pstmt.executeUpdate();
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }   
        }catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        }
        
        
        return result;
    }


    @Override
    public Contenedor queryByContenedor(int idbuscado) {
        
        int result =0;
        int esRefri=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2 = null;
        PreparedStatement pstmt3 = null;
        ResultSet rs = null;
        ResultSet rs2 = null;
        ResultSet rs3 = null;
        Contenedor cont= null;
        
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                                   "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            String SQLString = null;
            
            SQLString ="SELECT * FROM G04_CONTENEDOR WHERE IDCONTENEDOR = "+idbuscado+"";
            pstmt = conn.prepareStatement(SQLString);      
            rs =  pstmt.executeQuery();
            
            while (rs.next()){
                int id = rs.getInt("IDCONTENEDOR");
                float peso_neto = rs.getFloat("PESO_NETO");
                float peso_bruto = rs.getFloat("PESO_BRUTO");
                float volumen = rs.getFloat("VOLUMEN");
                String desc=rs.getString("DESCRIPCION");
                float tara = rs.getFloat("TARA");
                String tipoC= rs.getString("TIPO");
                
                
                if (tipoC.equalsIgnoreCase("R")){
                        esRefri=1;
                         pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM G04_REFRIGERADO "
                                 +" where G04_REFRIGERADO.IDCONTENEDOR="+id+"");
                         rs2 =  pstmt2.executeQuery();
                         if (rs2.next()){
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                         }
                         rs2.close();
                } else {
                    pstmt3 = conn.prepareStatement("SELECT TIPO_DE_CONTENIDO, ESTADO FROM G04_NO_REFRIGERADO "
                                 +" where G04_NO_REFRIGERADO.IDCONTENEDOR="+id+"");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_DE_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     }
                     rs3.close();
                    }
                
                
            }
            
            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return cont;
    }

    @Override
    public int insertContxDoc(int idDoc, int idCont) {
        
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
         
            String connectionUrl =  "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                                    "databaseName=inf282;user=inf282;password=inf282db;";
            
            conn = DriverManager.getConnection(connectionUrl);
            
            String SQLString = null;
            
            SQLString = "INSERT INTO G04_DOCUMENTOXCONTENEDOR(IDDOCUMENTO,IDCONTENEDOR,FECHA)"
                        + "VALUES(?,?,?)";
            
            pstmt = conn.prepareStatement(SQLString);
            pstmt.setString(1,Integer.toString(idDoc) );
            pstmt.setString(2,Integer.toString(idCont) );
            pstmt.setString(3,null);
            
            result =  pstmt.executeUpdate();
            
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return result;
    }

    @Override
    public ArrayList<Contenedor> queryAllContxDoc(int idDoc) {
        
        ArrayList <Contenedor> contenedorList = new ArrayList<Contenedor>();
            
            Connection conn = null;
            PreparedStatement pstmt = null;
            PreparedStatement pstmt2=null;
            PreparedStatement pstmt3=null;
            ResultSet rs = null;
            ResultSet rs2=null;
            ResultSet rs3=null;
            
            try{
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+"databaseName=inf282;user=inf282;password=inf282db;";
                conn = DriverManager.getConnection(connectionUrl);
                pstmt = conn.prepareStatement("SELECT c.idcontenedor,c.peso_neto,c.peso_bruto,c.volumen,c.descripcion,c.tara,c.tipo "
                                             +" FROM G04_CONTENEDOR c ,G04_DOCUMENTOXCONTENEDOR dxc "
                                             +" WHERE  dxc.IDDOCUMENTO="+idDoc+" AND c.IDCONTENEDOR=dxc.IDCONTENEDOR");
                rs =  pstmt.executeQuery();
                
                while (rs.next()){
                        int id = rs.getInt("IDCONTENEDOR");
                        float peso_neto = rs.getFloat("PESO_NETO");
                        float peso_bruto = rs.getFloat("PESO_BRUTO");
                        float volumen = rs.getFloat("VOLUMEN");
                        String desc=rs.getString("DESCRIPCION");
                        float tara = rs.getFloat("TARA");
                        String tipoC= rs.getString("TIPO");
                        Contenedor cont= null;
                     //   cont = new Contenedor(id,peso_neto,peso_bruto,volumen,desc,tara,tipoC);
                    if (tipoC.equalsIgnoreCase("R")) {
                        pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM G04_REFRIGERADO "
                                + " where G04_REFRIGERADO.IDCONTENEDOR=" + id + "");
                        rs2 = pstmt2.executeQuery();
                        if (rs2.next()) {
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                        }
                        rs2.close();
                    } else {
                        pstmt3 = conn.prepareStatement("SELECT TIPO_DE_CONTENIDO, ESTADO FROM G04_NO_REFRIGERADO "
                                 +" where G04_NO_REFRIGERADO.IDCONTENEDOR="+id+"");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_DE_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     }
                     rs3.close();
                    }
                   contenedorList.add(cont);
            }



            }catch(Exception ex){
                ex.printStackTrace();
            }finally{
                 //5. Se cierra la conexión
                try {if (rs != null) rs.close(); }
                 catch(Exception e){
                     e.printStackTrace();
                 }
            }
            
        return contenedorList;        
    }

    @Override
    public int deleteCont(int id) {
        int result=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2=null;
        PreparedStatement pstmt3=null;
        ResultSet rs = null;
        
        try {
            //1. Se registra el driver de la BD
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                    "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            String SQLString2=null;
            String SQLString3=null;
            //Se prepara la sentencia SQL
            SQLString ="DELETE FROM G04_NO_REFRIGERADO"+" WHERE IDCONTENEDOR = "+id+";";
            SQLString2="DELETE FROM G04_REFRIGERADO"+" WHERE IDCONTENEDOR = "+id+";";
            SQLString3="DELETE FROM G04_CONTENEDOR"+" WHERE IDCONTENEDOR = "+id+";";
            
            pstmt = conn.prepareStatement(SQLString);
            result =  pstmt.executeUpdate();
            
            pstmt2=conn.prepareStatement(SQLString2);
            result =  pstmt2.executeUpdate();
            
            pstmt3=conn.prepareStatement(SQLString3);
            result =  pstmt3.executeUpdate();
            
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        
        
        return result;
        
    }
}
